const path 		         = require('path');				          // 路径模块
const express 	       = require('express');			        // express
const exphbs  	       = require('express-handlebars');   // handlebars 模板引擎
const favicon 	       = require('serve-favicon'); 	      // 应用图标
const cookieParser     = require('cookie-parser'); 	      // cookie
const session 	       = require('express-session'); 	    // session
const bodyParser       = require('body-parser'); 		      // post提交参数获取
const MongoStore       = require('connect-mongo')(session); // 将session 存储在mongodb
const mongoose         = require('mongoose');
const expressValidator = require('express-validator');
const flash 	         = require('connect-flash'); 	  	  // 消息提醒
const logger 	         = require('morgan'); 			        // 日志打印
const config 	         = require('config-lite'); 		      // 读取配置文件
const routes 	         = require('./server/routes'); 	    // 路由
const moment 	         = require('moment'); 	  		      // 时间处理
const pkg 		         = require('./package'); 		  	    // package.json

// 实例化express
var app = express();


// 链接数据库
mongoose.connect(config.mongodb);
var db = mongoose.connection;
db.on('error', function () {
  throw new Error('unable to connect to database at ' + config.mongodb);
});
db.on('success', function () {
  console.log("连接成功！");
});

// 设置页面目录
// app.set('views', path.join(__dirname, 'views'));

// 设置模板引擎

// app.engine('hbs', exphbs.create({
//   	layoutsDir: 'views',					// 页面根目录
//   	partialsDir: 'views/templates/',		// 模板目录
//   	defaultLayout: 'layouts/application',	// 公共模板目录
//   	extname: '.hbs',						// 模板后缀名
// 	helpers: {
// 		section: function (name, options) {
// 			if(!this._sections) this._sections = {};
// 			this._sections[name] = options.fn(this);
// 			return null;
// 		}
// 	}
// }));

exphbs.create({
  	layoutsDir: 'views',					// 页面根目录
  	partialsDir: 'views/templates/',		// 模板目录
  	defaultLayout: 'layouts/application',	// 公共模板目录
  	extname: '.hbs',						// 模板后缀名
	helpers: {
		section: function (name, options) {
			if(!this._sections) this._sections = {};
			this._sections[name] = options.fn(this);
			return null;
		}
	}
})
app.engine('hbs', exphbs({
  layoutsDir: 'views',					// 页面根目录
  partialsDir: 'views/templates/',		// 模板目录
  defaultLayout: 'layouts/application',	// 公共模板目录
  extname: '.hbs'						// 模板后缀名
}));
app.set('view engine', 'hbs');			// 设置模板引擎

// less文件制定目录自动转换
app.use(require('less-middleware')(path.join(__dirname, 'public')));

// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public')));

// uncomment after placing your favicon in /public 网页图标
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));

// 打印日志
app.use(logger('dev'));

// 把post提交的请求转换成json格式
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// cookie 中间件
app.use(cookieParser());

// session 中间件
app.use(session({
  name: config.session.key,			// 设置 cookie 中保存 session id 的字段名称
  secret: config.session.secret,	// 通过设置 secret 来计算 hash 值并放在 cookie 中，使产生的 signedCookie 防篡改
  cookie: {
    maxAge: config.session.maxAge	// 过期时间，过期后 cookie 中的 session id 自动删除
  },
  store: new MongoStore({			// 将 session 存储到 mongodb
    url: config.mongodb				// mongodb 地址
  })
}));

// 验证模块  错误消息模板
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;
 
    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

// flash 中间价，用来显示通知
app.use(flash());


// 添加模板必需的三个变量
app.use(function (req, res, next) {
  res.locals.user = req.session.user;
  res.locals.success = req.flash('success').toString();
  res.locals.error = req.flash('error').toString();
  res.locals.info = req.flash('info').toString();
  next();
});

// 路由
routes(app);

// 监听端口，启动程序
app.listen(config.port, function () {
  console.log(`${pkg.name} listening on port ${config.port}`);
});
